struct _StAdjustmentPrivate
{
+ ClutterActor *actor;
+
/* Do not sanity-check values while constructing,
* not all properties may be set yet. */
guint is_constructing : 1;
{
PROP_0,
+ PROP_ACTOR,
PROP_LOWER,
PROP_UPPER,
PROP_VALUE,
static gboolean st_adjustment_set_page_size (StAdjustment *adjustment,
gdouble size);
+static ClutterActor *
+st_adjustment_get_actor (ClutterAnimatable *animatable)
+{
+ StAdjustment *adjustment = ST_ADJUSTMENT (animatable);
+ StAdjustmentPrivate *priv = st_adjustment_get_instance_private (adjustment);
+
+ g_warn_if_fail (priv->actor);
+
+ return priv->actor;
+}
+
static void
animatable_iface_init (ClutterAnimatableInterface *iface)
{
+ iface->get_actor = st_adjustment_get_actor;
}
static void
switch (prop_id)
{
+ case PROP_ACTOR:
+ g_value_set_object (value, priv->actor);
+ break;
+
case PROP_LOWER:
g_value_set_double (value, priv->lower);
break;
}
}
+static void
+actor_destroyed (gpointer user_data,
+ GObject *where_the_object_was)
+{
+ StAdjustment *adj = ST_ADJUSTMENT (user_data);
+ StAdjustmentPrivate *priv = st_adjustment_get_instance_private (adj);
+
+ priv->actor = NULL;
+
+ g_object_notify_by_pspec (G_OBJECT (adj), props[PROP_ACTOR]);
+}
+
static void
st_adjustment_set_property (GObject *gobject,
guint prop_id,
GParamSpec *pspec)
{
StAdjustment *adj = ST_ADJUSTMENT (gobject);
+ StAdjustmentPrivate *priv;
+
+ priv = st_adjustment_get_instance_private (ST_ADJUSTMENT (gobject));
switch (prop_id)
{
+ case PROP_ACTOR:
+ if (priv->actor)
+ g_object_weak_unref (G_OBJECT (priv->actor), actor_destroyed, adj);
+ priv->actor = g_value_get_object (value);
+ if (priv->actor)
+ g_object_weak_ref (G_OBJECT (priv->actor), actor_destroyed, adj);
+ break;
+
case PROP_LOWER:
st_adjustment_set_lower (adj, g_value_get_double (value));
break;
StAdjustmentPrivate *priv;
priv = st_adjustment_get_instance_private (ST_ADJUSTMENT (object));
+ if (priv->actor)
+ {
+ g_object_weak_unref (G_OBJECT (priv->actor), actor_destroyed, object);
+ priv->actor = NULL;
+ }
g_clear_pointer (&priv->transitions, g_hash_table_unref);
G_OBJECT_CLASS (st_adjustment_parent_class)->dispose (object);
object_class->set_property = st_adjustment_set_property;
object_class->dispose = st_adjustment_dispose;
+ props[PROP_ACTOR] =
+ g_param_spec_object ("actor", "Actor", "Actor",
+ CLUTTER_TYPE_ACTOR,
+ ST_PARAM_READWRITE);
+
props[PROP_LOWER] =
g_param_spec_double ("lower", "Lower", "Lower bound",
-G_MAXDOUBLE, G_MAXDOUBLE, 0.0,
}
StAdjustment *
-st_adjustment_new (gdouble value,
+st_adjustment_new (ClutterActor *actor,
+ gdouble value,
gdouble lower,
gdouble upper,
gdouble step_increment,
gdouble page_size)
{
return g_object_new (ST_TYPE_ADJUSTMENT,
+ "actor", actor,
"value", value,
"lower", lower,
"upper", upper,
priv->hscrollbar_policy = ST_POLICY_AUTOMATIC;
priv->vscrollbar_policy = ST_POLICY_AUTOMATIC;
- priv->hadjustment = g_object_new (ST_TYPE_ADJUSTMENT, NULL);
+ priv->hadjustment = g_object_new (ST_TYPE_ADJUSTMENT,
+ "actor", self,
+ NULL);
priv->hscroll = g_object_new (ST_TYPE_SCROLL_BAR,
"adjustment", priv->hadjustment,
"vertical", FALSE,
NULL);
- priv->vadjustment = g_object_new (ST_TYPE_ADJUSTMENT, NULL);
+ priv->vadjustment = g_object_new (ST_TYPE_ADJUSTMENT,
+ "actor", self,
+ NULL);
priv->vscroll = g_object_new (ST_TYPE_SCROLL_BAR,
"adjustment", priv->vadjustment,
"vertical", TRUE,